/*
 * @Description: 
 * @version: 
 * @Author: King
 * @Date: 2022-04-25 09:49:50
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2022-04-25 11:18:52
 */
// 封装一个深度克隆
// 1.判断是否是基本类型数据 2.判断是数组还是对象  3.如果是数组或者对象则对其进行相应的克隆（递归） 4.找出口
function deepClone(origin, target){
  var target = target || {} 
  let toStr = Object.prototype.toString
  let arrStr = "[object Array]"
  for(let prop in origin){
    if(origin.hasOwnProperty(prop)){
      // typeof()无法识别null
      if(origin[prop] !== null && typeof(origin[prop]) == "object") {
        if(toStr.call(origin[prop]) == arrStr){
          // 判断为数组类型
          target[prop] = []
        }else{
          // 判断为对象类型
          target[prop] = {}
        }
        // 递归此方法继续克隆
        deepClone(origin[prop], target[prop])
      }else{
        // 如果是基本类型数据
        target[prop] = origin[prop]
      }
    }
  }
  // 整个函数要返回一个新克隆出来的数据
  return target
}
let origin = {
  m:1,
  n:{
    t:2
  },
  y:[1,2,3,4]
}
var target = {}
console.log(origin,target)
deepClone(origin,target)
console.log(origin,target)
target.y = 2
console.log(origin,target)